ActiveRecord
ActiveRecord 是 Rails 的 ORM 元件(Object-relational mapping),負責與資料庫溝通,讓我們可以用物件導向的語法操作資料庫。
例如在前幾天實作CRUD的過程中,仔細回想我們怎麼跟資料庫互動的話會發現,我們好像沒有寫到任何一句SQL語法去對資料庫做互動,而是直接對物件做互動:像是@guest.new、@guest.save、@guest.find⋯⋯等等,透過ActiveRecord預設的方法轉成相對映的SQL語法,讓我們不用撰寫繁瑣的SQL語法,也增加了程式碼的維護性。
當然,任何東西都是有利有弊的。有一派的人就反對使用ORM,他們認為直接對資料庫下SQL語法才能有最好的執行效能。這點可以說是沒錯的,畢竟透過ORM等於是將程式多包裝了一層,在執行效能上當然會比更底層的SQL語法來得低。
不過,在開發以商務邏輯為主的網站時,犧牲一點執行效能換取高效的開發時間及開發門檻,這筆交易看起來還是滿划算的。
基礎操作
ActiveRecord提供了四種API,分別是save、save!、create和create!
我們可以利用主控台來練習操作這幾個功能,首先進入專案資料夾並輸入rails c打開主控台
a = Guest.new(:description => 'will go wrong')
a.save
b = Guest.new(:description => 'will go wrong')
b.save!
這邊刻意在新增Guest物件時不輸入title,讓程式出錯,讓我們可以觀察有無驚嘆號的不同。
實際輸入後就會發現a.save,主控台會回傳布林值false(or true),而b.save!程式則會直接跳出例外如下:
而create則是new+save的結合
如
c = Guest.create(:title => 'Bikon',:description => 'Time to sleep!' )
何時使用驚嘆號版本呢?
save和create通常用在會處理回傳布林值(true/false)的情況下(例如在 controller 裡面根據成功失敗決定 render 或 redirect)。
否則在預期應該會儲存成功的情況下,請用 save!或create! 來處理,這樣一旦碰到儲存失敗的情形,才好追蹤 bug。
另外可以透過 :validate => false 可以略過驗證
c.save( :validate => false )